resolver (graphql)
特定のフィールドの値をどう取得するかを定義する関数
GraphQLでは下記2つが分離されていて、resolverは後者を表す
何を返すか (schema)
どう返すか (resolver)
resolverの引数
code:ts
(fieldParent, args, context, info) => { ... }
parent
親のフィールドの値
ネスト時に使う
args
クエリで指定された引数
context
info
AST など低レベル情報
普通はあまり使わない
例: User → posts の Resolver
schema
code:graphql(js)
type Query {
user(id: ID!): User
}
type User {
id: ID!
name: String!
}
type Post {
id: ID!
title: String!
}
resolver
code:ts
const resolvers = {
Query: {
user: async (_, { id }, { db }) => db.user.findById(id)
},
User: {
// parent は user object
posts: async (parent, _, { db }) => db.post.findMany({ userId: parent.id })
},
};
Query.user → db.user.findById
User.posts → 親の user.id を元に posts を取得
N+1 問題
GraphQLを扱う中で一番ダルいところと思ってたけど、
ただのrepositoryのようなもので、
普通にrestを書く時よりはだいぶ手間減ってるか
restのときは、同じfieldに対しても、複数のrepoisitoryを書くことも合ったわけで
graphqlの場合は、1対1でしかない
まあでも1対1だからこそ数が増えてダルいということはありうるか
mutationの場合は、restのrespoitoryとほぼほぼ同じか
rootに追加されたresolverのこと
例
code:js
const resolvers = {
Query: { …… },
Mutation: { …… },
Photo: {
url: parent => http://yoursite.com/img/${parent.id}.jpg
}
}
これのPhotoの中のurlとかがtrivial resolver